package Set_and_Dict;

/*
回旋镖的数量
给定平面上n 对 互不相同 的点points ，其中 points[i] = [xi, yi] 。
回旋镖 是由点(i, j, k) 表示的元组 ，其中i和j之间的欧式距离和i和k之间的欧式距离相等（需要考虑元组的顺序）。
返回平面上所有回旋镖的数量。

示例 1：
输入：points = [[0,0],[1,0],[2,0]]
输出：2
解释：两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例 2：
输入：points = [[1,1],[2,2],[3,3]]
输出：2
示例 3：
输入：points = [[1,1]]
输出：0

作者：LeetCode
链接：https://leetcode.cn/leetbook/read/all-about-lockup-table/xhp45m/
 */

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class _43回旋镖的数量 {
    public static void main(String[] args) {

        int[][] n = {{0,0},{1,0},{2,0}};
        System.out.println(numberOfBoomerangs(n));

    }

    //根据每个点与其他点的距离当做键值 建立哈希表
    //而后就是排序组合问题
    //就是官解
    public static int numberOfBoomerangs(int[][] points) {
        if (points == null || points.length <= 2) return 0;
        int n = points.length;
        int count = 0;
        for (int i = 0; i < n; i++) {
            HashMap<Double, Integer> map = new HashMap<>();
            for (int j = 0; j < n; j++) {
                if(j == i) continue;
                int x = points[i][0] - points[j][0];
                int y = points[i][1] - points[j][1];
                double s = Math.sqrt(x * x + y * y);
                map.put(s, map.getOrDefault(s, 0) + 1);
            }
            Set<Map.Entry<Double, Integer>> entries = map.entrySet();
            for (Map.Entry<Double, Integer> entry : entries) {
                Integer value = entry.getValue();
                if (value >= 2){
                    count += value * (value - 1);
                }
            }
        }
        return count;
    }
}
